/**
 * 
 */
package co.edu.udistrital.analyzer.business.services;

import java.io.IOException;
import java.io.Reader;
import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.apache.lucene.document.Document;

import weka.classifiers.Evaluation;
import co.edu.udistrital.analyzer.business.orm.vo.DocumentClassifyDTO;
import co.edu.udistrital.analyzer.newversion.DocumentSearchDto;

/**
 * Interfaz para el servicio de la capa de negocio para manejo de operaciones
 * con objetos de tipo Cliente
 * 
 * @author Alejo
 * 
 */
public interface IndexerService extends Serializable {

	/**
	 * Realiza el indexdo de los documentos de entrenamiento
	 * 
	 * @param docsDir
	 *            Directorio donde se encuentran los documentos de entrenamiento
	 * @param indexDir
	 *            Directorio en el que se genera el indice para los documentos
	 *            de entrenamiento
	 * @param arffFileDir
	 *            Directorio para el archivo de clasificacion
	 * @param ontFiles
	 *            Directorio para los archivos de definicion de la ontologia
	 * @throws IOException
	 */
	void indexDocuments(String docsDir, String indexDir, String arffFileDir,
			String ontFiles) throws IOException;

	/**
	 * Realiza la evaluacion de varios algoritmos de aprendizaje
	 * 
	 * @param arffFileDir
	 *            Directorio del archivo para la clasificacion
	 * @param algs
	 *            Algoritmos de clasificacion a ser evaluados
	 * @return
	 */
	Map<String, Evaluation> evaluateClassifier(String arffFileDir,
			List<String> algs);

	/**
	 * Realiza el entrenamiento de un algoritmo de clasificacion
	 * 
	 * @param arffFileDir
	 *            Directorio del archivo para la clasificacion
	 * @param modelFileDir
	 *            Directorio del archivo para generar el modelo de clasificacion
	 * @param alg
	 *            Algoritmo de clasificacion
	 * @param newDocumentsIndexDir
	 *            Directorio en el que se genera el indice para los documentos
	 *            de trabajo de grado
	 */
	void train(String arffFileDir, String modelFileDir, String alg,
			String newDocumentsIndexDir) throws IOException;

	/**
	 * Realiza la clasificacion de un documento
	 * 
	 * @param indexDir
	 *            Directorio en el que se va a realizar la indexacion
	 * @param arffFileDir
	 *            Directorio del archivo para la clasificacion
	 * @param modelFileDir
	 *            Directorio del archivo del modelo de clasificacion
	 * @param reader
	 *            Objeto de lectura del archivo
	 * @param filename
	 *            Nombre del archivo
	 * @param ontFiles
	 *            Archivos de definicion de las ontologias
	 * @throws IOException
	 */
	List<DocumentClassifyDTO> classifyDocument(String indexDir, String arffFileDir,
			String modelFileDir, Reader reader, String filename, String ontFiles)
			throws IOException;

	/**
	 * Classify all documents in a directory
	 * 
	 * @param docsDir
	 * @param indexDir
	 * @param arffFileDir
	 * @param modelFileDir
	 * @param ontFiles
	 * @throws IOException
	 */
	List<DocumentClassifyDTO> classifyDocuments(String docsDir, String indexDir, String arffFileDir,
			String modelFileDir, String ontFiles) throws IOException;

	/**
	 * Searchs documents in an index that matchs the key terms
	 * 
	 * @param newDocumentsIndexDir
	 * @param keyTerms
	 * @return
	 */
	List<DocumentSearchDto> search(String newDocumentsIndexDir,
			String keyTerms, float hitsScore, String ontFiles);

	/**
	 * Searches a document by its id
	 * 
	 * @param newDocumentsIndexDir
	 * @param id
	 * @return
	 */
	Document searchById(String newDocumentsIndexDir, String id);
}
